package add__2_basalsyntax;

import java.util.Arrays;

/*

输出结果：
1
1
[1, 2, 3]
[2, 3, 4]
abc
abc

这是为什么呢？整数、数组和字符串作为参数传给方法，方法体内部对参数进行了修改，但整数和字符串没有改变成功，
数组却改变成功了



这是由于 Java 的参数传递方式不同导致的。

对于基本数据类型，如整数 int，当我们将其作为参数传入方法中时，实际上传递的是该整数的值的副本（即复制品），
因此在方法内部对该值进行的修改并不会影响到原始值。
在上述代码中，addOne(int num) 方法中对 num 的修改只是在方法内部有效，方法结束后，
原始值 num 并没有被改变。

对于对象类型，如数组和字符串，在方法中传递参数时，传递的是对象的引用（即地址），而不是对象本身的副本。
因此，当我们在方法内部修改该对象时，实际上是在修改原始对象本身，因此原始对象的内容也会发生改变。

在上述代码中，addOne(int[] nums) 方法中对 nums 数组的修改，实际上是直接修改了原始数组对象的每个元素的值，
因此原始数组的内容也随之发生了改变。
而对于 addOne(String str) 方法中的 str 字符串，由于 Java 中字符串是不可变的，
因此 str += "one" 的操作实际上是创建了一个新的字符串对象，而原始的 str 字符串并没有被修改。




 */
public class ParameterTransmitOnMethods {
    
    

    public static void main(String[] args) {
        int num = 1;
        System.out.println(num);
        addOne(num);
        System.out.println(num);
        
        
        int[] nums = {1, 2, 3};
        System.out.println(Arrays.toString(nums));
        addOne(nums);
        System.out.println(Arrays.toString(nums));
        
        
        String str = "abc";
        System.out.println(str);
        addOne(str);
        System.out.println(str);
        
        
        int[][] numss = {{1, 2, 3}, {11, 22, 33}, {111, 222, 333}};
        addOne(numss);
        for (int i = 0; i < numss.length; i++) {
            System.out.println(Arrays.toString(numss[i]));
        }
        
        
    }

    private static void addOne(int[][] numss) {
        for (int i = 0; i < numss.length; i++) {
            for (int j = 0; j < numss.length; j++) {
                numss[i][j] += 1;
            }
        }
    }
    
    private static void addOne(String str) {
        str += "one";
    }

    
    private static void addOne(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] += 1;
        }
    }

    private static void addOne(int num) {
        num += 1;
    }

}
